package cn.kgc.tangcco.liahozhe.spring.a_hello;

import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

import cn.kgc.tangcco.liahozhe.spring.pojo.User;

public class App {
	@Test
	public void test01() {
		// 传统类的实例化过程需要硬编码实现 即 new
		// 如果一个接口的实现类实例化的过程使用传统方式实现，
		// 当使用新的实现类的时需要重新编写代码
		User user01 = new User();
		user01.setName("李哲");
		User user02 = new User(1, "李昊哲");
		System.out.println(user01.getName());
		System.out.println(user02.getName());
	}
	@Test
	// 1、通过工厂类得到IOC容器
	public void test02() {
		// 把对象的创建交给spring的IOC容器
		// 1、加载配置文件
		ClassPathResource resource = new ClassPathResource("cn/kgc/tangcco/liahozhe/spring/a_hello/bean.xml");
		// 2、创建容器对象(BeanFactory) IOC容器 = 工厂类 + applicationContext.xml
		BeanFactory factory = new XmlBeanFactory(resource);
		// 3、得到容器创建的对象
		User user = (User) factory.getBean("user");
		user.setName("李哲");
		System.out.println(user.getName());
	}
	@Test
	// 2、直接得到IOC容器 PS:推荐使用
	public void test03() {
		// 1、得到IOC容器
		ApplicationContext context = new ClassPathXmlApplicationContext("cn/kgc/tangcco/liahozhe/spring/a_hello/bean.xml");
		// 2、从IOC容器中获取对象
		User user = (User) context.getBean("user");
		user.setName("李哲");
		System.out.println(user.getName());
	}
	@Test
	// 2、直接得到IOC容器 PS:推荐使用
	public void test04() {
		// 1、得到IOC容器
		ApplicationContext context = new ClassPathXmlApplicationContext("cn/kgc/tangcco/liahozhe/spring/a_hello/bean.xml");
		System.out.println("----容器创建完成----");
		// 2、从IOC容器中获取对象
		User user01 = (User) context.getBean("user");
		User user02 = (User) context.getBean("user");
		user01.setName("李哲");
		// 默认情况下由IOC容器创建的对象是单例对象
		System.out.println(user01.hashCode());
		System.out.println(user02.hashCode());
		System.out.println(user01.getName());
		System.out.println(user02.getName());
	}
	/**
	 * 1) 对象创建： 单例/多例
	 * 	scope="singleton", 默认值， 即 默认是单例	【service/dao/工具类】
	 *  scope="prototype", 多例； 				【Action对象】
	 * 
	 * 2) 什么时候创建?
	 * 	  scope="prototype"  在用到对象的时候，才创建对象。
	 *    scope="singleton"  在启动(容器初始化之前)， 就已经创建了bean，且整个应用只有一个。
	 * 3)是否延迟创建
	 * 	  lazy-init="false"  默认为false,  不延迟创建，即在启动时候就创建对象
	 * 	  lazy-init="true"   延迟初始化， 在用到对象的时候才创建对象
	 *    （只对单例有效）
	 * 4) 创建对象之后，初始化/销毁
	 * 	  init-method="init_user"       【对应对象的init_user方法，在对象创建之后执行 】
	 *    destroy-method="destroy_user"  【在调用容器对象的destroy方法时候执行，(容器用实现类)】
	 */
}
